package name.huliqing.qfaces.temp;
//package name.huliqing.qfaces.component;
//
//import java.io.IOException;
//import java.util.List;
//import java.util.Map;
//import java.util.TimeZone;
//import java.util.logging.Logger;
//import javax.el.MethodExpression;
//import javax.faces.component.UIComponent;
//import javax.faces.component.UIInput;
//import javax.faces.context.FacesContext;
//import javax.faces.context.ResponseWriter;
//import javax.faces.convert.DateTimeConverter;
//import javax.xml.parsers.ParserConfigurationException;
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import name.huliqing.qfaces.QFaces;
//import name.huliqing.qfaces.XmlOper;
//import name.huliqing.qfaces.component.Frame.CssPosition;
//import name.huliqing.qfaces.model.ActionDate;
//
//public class ____20100630_Calendar extends UIInput implements Ajax{
//	private final static Logger logger = Logger.getLogger(____20100630_Calendar.class.getName());
//	
//	// ---- 参数
//	
//	// As calendar, 绑定后台方法,该方法向后台传递年份及月分，并获取这个月分存在的活动日期列表，
//	// 返回类型为List<ActionDate>，其中包含了这个月份所有存在活动事件的日期及事件描述
//	private MethodExpression listener;
//	
//	// As calendar, 日历的链接地址，当运行方式为“非POP”时，如果某个日期存在“活动”则
//	// 点击某一个日期时需要连接到目标页面。href即为连接地址。
//	private String href; 
//	
//	// As calendar, href连接地址的打开方式，如“_blank”,"_self", "_parent"等
//	private String target;
//	
//	// As calendar, 是否显示“活动事件”面板，当某一天存在活动事件时，鼠标移动到日期上面会弹出该窗口
//	private Boolean showActionPanel;
//	
//	// As pop, 渲染为“弹出窗口”模式，这个模式将作为一般的日期输入组件来用
//	private Boolean renderAsPop;
//	
//	// As pop, 
//	// 参数For, 该参数指定到目标客户端组件ID，也就是将选择的日期赋值给for参数所
//	// 指定的目标组件，格式如下 "targetId1,targetId2,targetId3" 用半角逗号分隔
//	// 这样可以将日期值赋给多个目标组件，并且需要能够指定到一般的HTML客户端组件
//	// 这个参数只有在renderAsPop属性为true的时候才有意义
//	private String _for;
//	
//	// As pop, 图片URL：Open Button的图片URL
//	private String imgFlagSrc;
//	
//	// As pop, 日期格式，如："yyyy-MM-dd"
//	private String pattern;
//	
//	// As pop, value属性所绑定的日期的时区,如：GMT+8
//	private String timeZone;
//	
//	// As pop, InputField是否渲染为“只读”
//	private Boolean readOnly;
//	
//	// As pop, 是否自动关闭，即用户选择某个日期之后关闭日历组件
//	private Boolean autoClose;
//	
//	// "月分描述", 如：“一月,二月,三月,,,”， 用半角逗号分隔
//	private String strMonth;
//	
//	// “一周描述”， 如：“日,一,二,三,四,五,六”, 用半角逗号分隔
//	private String strWeek;
//	
//	// 图片URL：“上一个月”
//	private String imgPreviousSrc;
//	
//	// 图片URL：“下一个月”
//	private String imgNextSrc;
//	
//	// 图片URL：“下拉框箭头”,用于弹出框选择年份，月份,
//	private String imgSelectSrc;
//	
//	// 起始年份,首次打开窗口时，年份选择列表的默认起始年份,注：该值只有在目标组件的值为空时，才有效。
//	// 如果目标组件的值不为空，则以目标组件的年份值- visibleYear / 2 作为真正的startYear,这样保证
//	// 年份选择列表的目标组件年份值始终处于列表的正中
//	private Integer startYear;
//	
//	// 年份选择列表的可见个数
//	private Integer visibleYear;
//	
//	// 其它原有的参数:id,rendered,value
//	
//	// 日期组件的样式类
//	// input组件的样式(这个input只有在绑定了value之后才会出现)
//	private String style;
//	
//	// input组件的样式类（同上）
//	private String styleClass;
//	
//	// 组件日期区域的样式（不包含年份,月份）,该区域内含一个table,table中即为存放一个月中的1-31天的日期
//	private String styleClassCalendarBody;
//	
//	// Footer部分的样式类（注：不是Today区域的样式类，
//	// 但是Today区域被包含于Footer区域，所以这个样式同样会影响Today区域）
//	// 注：这个样式类不会通过js传递到客户端
//	private String styleClassCalendarFooter;
//	
//	// 当前选中的年份样式
//	private String styleClassYearSelected;
//	
//	// 当前选中的月份样式
//	private String styleClassMonthSelected;
//	
//	// 当前选中的日期样式
//	private String styleClassDaySelected;
//	
//	// 当前的日期样式
//	private String styleClassDayCurrent;
//	
//	// 鼠标放上时，日期的响应样式
//	private String styleClassDayOnmouseover;
//	
//	// 显示的年份的样式
//	private String styleClassYear;
//	
//	// 显示的月份的样式
//	private String styleClassMonth;
//	
//	// 显示的星期的样式
//	private String styleClassWeek;
//	
//	// 日期的样式
//	private String styleClassDayOfMonth;
//	
//	// “活动事件描述面板”的样式类
//	private String styleClassActionPanel;
//	
//	// “活动事件日期”的样式类
//	private String styleClassActionDate;
//	
//	// ---- 内部参数,下面这些参数将由组件自行设置
//	
//	// 组件ID
//	private String ID_CLIENT;
//	
//	// 整个渲染区域的最外框ID,与ID_CLIENT不同，ID_CLIENT是作为组件的唯一标识
//	private String ID_FULL;
//	
//	// 保存日期值的Field
//	private String ID_INPUT;
//	
//	// 日历区域的ID（含header及body,footer）
//	private String ID_CONTENT;
//	
//	// 日历区域的header ID (含年，月)
//	private String ID_CONTENT_HEADER;
//	
//	// 日历区域的body ID （含日历,一个月中的所有天数）
//	private String ID_CONTENT_BODY;
//	
//	// 日历区域的footer ID
//	private String ID_CONTENT_FOOTER;
//	
//	private Frame frame;
//	
//	@Override
//	public void restoreState(FacesContext fc, Object state) {
//		Object[] obj = (Object[]) state;
//		super.restoreState(fc, obj[0]);
//		this.listener = (MethodExpression) obj[1];
//	}
//	
//	@Override
//	public Object saveState(FacesContext fc) {
//		Object[] obj = new Object[2];
//		obj[0] = super.saveState(fc);
//		obj[1] = this.listener;
//		return obj;
//	}
//	
//	public void setListener(MethodExpression listener) {
//		this.listener = listener;
//	}
//
//	@Override
//	public void encodeBegin(FacesContext fc) throws IOException {
//		if (!isRendered()) {
//            return;
//        }
//		// 载入资源
//        QFaces.getResLoader2().loadJavaScript(this, "QFaces-DateFormat.js");
//        QFaces.getResLoader2().loadJavaScript(this, "Calendar.js");
//		
//		// 获取参数
//		int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
//		this.href = (String) QFaces.getAttribute(this, "href", "");
//		this.target = (String) QFaces.getAttribute(this, "target", "_self");
//		this.showActionPanel = QFaces.convertToBoolean(QFaces.getAttribute(this, "showActionPanel", Boolean.TRUE));
//		
//		this.renderAsPop = QFaces.convertToBoolean(QFaces.getAttribute(this, "renderAsPop", false));
//		this._for = (String) QFaces.getAttribute(this, "for", "");
//		this.imgFlagSrc = (String) QFaces.getAttribute(this, "imgFlagSrc", QFaces.getResLoader2().makeImageSrc("04-flag.png"));
//		this.pattern = (String) QFaces.getAttribute(this, "pattern", "yyyy-MM-dd");
//		this.timeZone = (String) QFaces.getAttribute(this, "timeZone", TimeZone.getDefault().getID());
//		this.readOnly = QFaces.convertToBoolean(QFaces.getAttribute(this, "readOnly", false));
//		this.autoClose = QFaces.convertToBoolean(QFaces.getAttribute(this, "autoClose", true));
//		this.visibleYear = QFaces.convertToInteger(QFaces.getAttribute(this, "visibleYear", 12));
//		this.startYear = QFaces.convertToInteger(QFaces.getAttribute(this, "startYear", (currentYear - visibleYear / 2)));
//
//		this.strMonth = (String) QFaces.getAttribute(this, "strMonth", "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月");
//		this.strWeek = (String) QFaces.getAttribute(this, "strWeek", "日,一,二,三,四,五,六");
//		this.imgPreviousSrc = (String) QFaces.getAttribute(this, "imgPreviousSrc", QFaces.getResLoader2().makeImageSrc("04-previous.png"));
//		this.imgNextSrc = (String) QFaces.getAttribute(this, "imgNextSrc", QFaces.getResLoader2().makeImageSrc("04-next.png"));
//		this.imgSelectSrc = (String) QFaces.getAttribute(this, "imgSelectSrc", QFaces.getResLoader2().makeImageSrc("04-select.png"));
//		
//		this.style = (String) QFaces.getAttribute(this, "style", "");
//		this.styleClass = (String) QFaces.getAttribute(this, "styleClass", "_qf_04_style");
//		this.styleClassCalendarBody = (String) QFaces.getAttribute(this, "styleClassCalendarBody", "");
//		this.styleClassCalendarFooter = (String) QFaces.getAttribute(this, "styleClassCalendarFooter", "_qf_04_footer");
//		this.styleClassYearSelected = (String) QFaces.getAttribute(this, "styleClassYearSelected", "_qf_04_yearSelected");
//		this.styleClassMonthSelected = (String) QFaces.getAttribute(this, "styleClassMonthSelected", "_qf_04_monthSelected");
//		this.styleClassDaySelected = (String) QFaces.getAttribute(this, "styleClassDaySelected", "_qf_04_daySelected");
//		this.styleClassDayCurrent = (String) QFaces.getAttribute(this, "styleClassDayCurrent", "_qf_04_dayCurrent");
//		this.styleClassDayOnmouseover = (String) QFaces.getAttribute(this, "styleClassDayOnmouseover", "_qf_04_dayOnmouseover");
//		this.styleClassYear = (String) QFaces.getAttribute(this, "styleClassYear", "_qf_04_year");
//		this.styleClassMonth = (String) QFaces.getAttribute(this, "styleClassMonth", "_qf_04_month");
//		this.styleClassWeek = (String) QFaces.getAttribute(this, "styleClassWeek", "_qf_04_week");
//		this.styleClassDayOfMonth = (String) QFaces.getAttribute(this, "styleClassDayOfMonth", "_qf_04_dayOfMonth");
//		this.styleClassActionPanel = (String) QFaces.getAttribute(this, "styleClassActionPanel", "_qf_04_actionPanel");
//		this.styleClassActionDate = (String) QFaces.getAttribute(this, "styleClassActionDate", "_qf_04_actionDate");
//		
//		// 内部参数
//		this.ID_CLIENT = getClientId(fc);
//		this.ID_FULL = ID_CLIENT + ":full";
//		this.ID_INPUT = ID_CLIENT; // inputId必须与clientId相同.
//		this.ID_CONTENT = ID_CLIENT + ":content";
//		this.ID_CONTENT_HEADER 	= ID_CONTENT + ":header";
//		this.ID_CONTENT_BODY 	= ID_CONTENT + ":body";
//		this.ID_CONTENT_FOOTER 	= ID_CONTENT + ":footer";
//		
//		this.frame = new Frame();
//		this.frame.loadAttributeFrom(this);
//		// 组件的不同状态要求的默认属性不一样，但是仍然保留以用户的设置优先
//		if (this.renderAsPop) {
//			if (this.frame.getVisible() == null)
//				this.frame.setVisible(Boolean.FALSE);
//			if (this.frame.getCssPosition() == null)
//				this.frame.setCssPosition(CssPosition.ABSOLUTE.name());
//		} else {
//			if (this.frame.getDrag() == null)
//				this.frame.setDrag(Boolean.FALSE);
//			if (this.frame.getRenderCloseButton() == null)
//				this.frame.setRenderCloseButton(Boolean.FALSE);
//		}
//		
//		// 处理客户端长ID, 将组件所引用的ID（short id），转化为客户端的长ID类型，以便客户端
//		if (!"".equals(this._for)) {
//			String[] forIds = null;
//			if (this._for.indexOf(",") != -1) {
//				forIds = this._for.split(",");
//			} else {
//				forIds = new String[]{this._for};
//			}
//			StringBuilder tempFor = new StringBuilder("");
//			for (String forId : forIds) {
//				UIComponent forCom = this.findComponent(forId.trim());
//				if (forCom != null) {
//					tempFor.append(forCom.getClientId(fc)).append(",");	// for 到JSF组件
//				} else {
//					tempFor.append(forId.trim()).append(","); // for 到一般的Html组件 
//				}
//			}
//			this._for = tempFor.toString();
//		}
//		if (this._for.endsWith(",")) this._for = this._for.substring(0, this._for.length() - 1);
//
//		
//		// 处理转换
//		if (this.getConverter() == null) {
//			DateTimeConverter con = new DateTimeConverter();
//			con.setPattern(pattern);
//			con.setTimeZone(TimeZone.getTimeZone(timeZone));
//			this.setConverter(con);
//		}
//		
//		// 检测参数是否正确
//		
//		if (!this.renderAsPop) {
//			if (listener == null) 
//				logger.warning("Attribute \"listener\" not found as render " +
//						"not a \"Date Selector\", 提示：作为日期选择器时，你应该设置组件属性renderAsPop=\"true\", " +
//						"如果作为事件日历来使用，那么你应该给组件绑定\"listener\"属性.");
//		}
//		
//		// ---------- 开始渲染输出 
//		
//		
//		// ------------ 渲染组件
//		
//		ResponseWriter rw = fc.getResponseWriter();
//		rw.startElement("span", this);
//		rw.writeAttribute("id", this.ID_FULL, null);
//		rw.writeAttribute("style", "border:0;", null);
//		
//		// 只有组件直接绑定了值,并且As pop(弹窗方式)的时候才有必要渲染input输入框
//		if (this.getValueExpression("value") != null && this.renderAsPop) {
//			rw.startElement("input", this);
//			rw.writeAttribute("id", this.ID_INPUT, null);
//			rw.writeAttribute("name", this.ID_INPUT, null);	// 必须加\"name\"属性，否则fc.getExternalContext().getRequestParameterMap().get(inputId);将获取不到值
//			rw.writeAttribute("type", "text", null);
//			rw.writeAttribute("style", this.style, null);
//			rw.writeAttribute("class", this.styleClass, null);
//			if (this.readOnly) rw.writeAttribute("readOnly", "true", null);
//			rw.writeAttribute("value", this.getConverter().getAsString(fc, this, this.getValue()), null);
//			rw.endElement("input");
//		}
//		
//		// 只有As pop(弹窗方式) 的时候才需要“开关”
//		if (this.renderAsPop) {
//			String event = "Q.F.UICalendar.display('" + ID_CLIENT + "')";
//			rw.startElement("img", this);
//			rw.writeAttribute("onclick", event, null);
//			rw.writeAttribute("style", "cursor:pointer;vertical-align:middle;margin:0 0 1px 0;", null);
//			rw.writeAttribute("src", this.imgFlagSrc, null); 
//			rw.writeAttribute("alt", "", null);
//			rw.endElement("img");
//		}
//		this.renderFrame(fc);
//		rw.endElement("span");
//		
//	}
//	@Override
//    public void encodeEnd(FacesContext fc) throws IOException {
//		if (!isRendered()) {
//            return;
//        }
//		// init
//        StringBuilder jsInit = new StringBuilder("Q.F.UICalendar.init(")
//                .append(" \"" + this.ID_CLIENT + "\"")
//                .append(",\"" + this.ID_FULL + "\"")
//                .append(",\"" + this.ID_INPUT + "\"")
//                .append(",\"" + this.ID_CONTENT + "\"")
//                .append(",\"" + this.ID_CONTENT_HEADER + "\"")
//                .append(",\"" + this.ID_CONTENT_BODY + "\"")
//                .append(",\"" + this.ID_CONTENT_FOOTER + "\"")
//                .append(",\"" + this.frame.getFrameId() + "\"")
//                .append(",\"" + this.getClass().getName() + "\"")
//                .append(",\"" + (this.listener != null ? this.listener.getExpressionString() : "") + "\"")
//                .append(",\"" + this.href + "\"")
//                .append(",\"" + this.target + "\"")
//                .append(",\"" + this.showActionPanel.toString() + "\"")
//                .append(",\"" + this.imgFlagSrc + "\"")
//                .append(",\"" + this.imgPreviousSrc + "\"")
//                .append(",\"" + this.imgNextSrc + "\"")
//                .append(",\"" + this.imgSelectSrc + "\"")
//                .append(",\"" + this.strMonth + "\"")
//                .append(",\"" + this.strWeek + "\"")
//                .append(",\"" + this._for + "\"")
//                .append(",\"" + this.renderAsPop.toString() + "\"")
//                .append(",\"" + this.pattern + "\"")
//                .append(",\"" + this.autoClose.toString() + "\"")
//                .append(",\"" + this.startYear + "\"")
//                .append(",\"" + this.visibleYear + "\"")
//                .append(",\"" + this.styleClassCalendarBody + "\"")
//                .append(",\"" + this.styleClassYearSelected + "\"")
//                .append(",\"" + this.styleClassMonthSelected + "\"")
//                .append(",\"" + this.styleClassDaySelected + "\"")
//                .append(",\"" + this.styleClassDayCurrent + "\"")
//                .append(",\"" + this.styleClassDayOnmouseover + "\"")
//                .append(",\"" + this.styleClassYear + "\"")
//                .append(",\"" + this.styleClassMonth + "\"")
//                .append(",\"" + this.styleClassWeek + "\"")
//                .append(",\"" + this.styleClassDayOfMonth + "\"")
//                .append(",\"" + this.styleClassActionPanel + "\"")
//                .append(",\"" + this.styleClassActionDate + "\"")
//                .append(")");
//        
//        QFaces.getResLoader2().loadJavaScriptInit(this, jsInit.toString());
//	}
//	
//	@Override
//	public void decode(FacesContext fc) {
//		// 只有绑定了值，才需要获取客户端的value来进行解码
//		if (this.getValueExpression("value") != null) {
//			String inputId = this.getClientId(fc) + ":input"; // ID必须与渲染到客户端时的ID一致
//			String dateStr = fc.getExternalContext().getRequestParameterMap().get(inputId);
//			this.setSubmittedValue(dateStr);			
//		}
//		super.decode(fc);
//	}
//
//	// ---- Ajax
//	
//	public void ajax(Map<String, String> params, FacesContext fc) {
//		logger.fine("ajax invoke on get...");
//		// 获取有活动事件的日期列表
//        String listenerExp = params.get("listenerExp");
//        Integer year = Integer.parseInt(params.get("year"));
//        Integer month = Integer.parseInt(params.get("month"));
//        MethodExpression _listener = QFaces.createMethodExpression(listenerExp,
//                        List.class,
//                        new Class[]{Integer.class, Integer.class});
//        Object[] args = {year, month};
//        List<ActionDate> ads = (List<ActionDate>) _listener.invoke(fc.getELContext(), args);
//        responseAsXML(fc, ads);
//	}
//	
//	/**
//     * format of return values
//     * <root>
//     *      <day dayOfMonth="1" description="111" />
//     *      <day dayOfMonth="2" description="222" />
//     *      <day dayOfMonth="3" description="333" />
//     *      <day dayOfMonth="4" description="444" />
//     *      <day dayOfMonth="5" description="555" />
//     * </root>
//     * @param fc
//     * @param results
//     */
//	private void responseAsXML(FacesContext fc, List<ActionDate> ads) {
//		try {
//            Document doc = XmlOper.newDocument();
//            Element nodeRoot = doc.createElement("root");
//            doc.appendChild(nodeRoot);
//            if (ads != null && !ads.isEmpty()) {
//            	for (ActionDate ad : ads) {
//        			Element dayElement = doc.createElement("day");
//        			dayElement.setAttribute("dayOfMonth", ad.getDayOfMonth() != null ? ad.getDayOfMonth().toString() : "aa");
//        			dayElement.setAttribute("description", ad.getDescription() != null ? ad.getDescription() :  "aa");
//        			nodeRoot.appendChild(dayElement);
//            	}
//            }
//            QFaces.getResponse().responseXML(fc, doc);
//        } catch (ParserConfigurationException e) {
//        	logger.warning(e.getMessage());
//        }
//	}
//
//	public void renderFrame(FacesContext fc) throws IOException {
//		ResponseWriter rw = fc.getResponseWriter();
//		
//		this.frame.encodeBegin(fc);
//		
//		rw.startElement("table", this);
//		rw.writeAttribute("border", "0", null);
//		rw.writeAttribute("width", "100%", null);
//		rw.writeAttribute("cellspacing", "0", null);
//		rw.writeAttribute("cellpadding", "0", null);
//			rw.startElement("tr", this);
//				rw.startElement("td", this);
//				rw.writeAttribute("id", this.ID_CONTENT_HEADER, null);
//				rw.endElement("td");
//			rw.endElement("tr");
//			
//			rw.startElement("tr", this);
//				rw.startElement("td", this);
//				rw.writeAttribute("id", this.ID_CONTENT_BODY, null);
//				rw.endElement("td");
//			rw.endElement("tr");
//			
//			rw.startElement("tr", this);
//				rw.startElement("td", this);
//				rw.writeAttribute("class", this.styleClassCalendarFooter, null);
//				rw.writeAttribute("id", this.ID_CONTENT_FOOTER, null);
//				rw.endElement("td");
//			rw.endElement("tr");
//		
//		rw.endElement("table");
//		this.frame.encodeEnd(fc);
//		
//	}
//	
//}
